<?php

namespace core;

class App
{
    //启动框架的方法
    public static function run()
    {
        //1.启动对话
        session_start();

        //2.公共函数库
        //DIRECTORY_SEPARATOR:路径分割符，自适应系统。__DIR__绝对路径
        require __DIR__ . DIRECTORY_SEPARATOR. 'common.php';

        //3.设置常量
        self::setConst();

        //4.注册自动加载器(PSR-4)
        spl_autoload_register([__CLASS__,'autoLoader']);
        //5.路由解析
        [$controller,$action,$params] = Router::parse();
        // d($controller);d($action);d($params);
        
        //6.实例化控制器
        // create view 实例
        // 视图模板入口
        $path = ROOT_APP_PATH.DIRECTORY_SEPARATOR.APP_NAME.DIRECTORY_SEPARATOR.'view'.DIRECTORY_SEPARATOR;

        // 模板文件命名规则：入口/控制器/方法
        $view = new View($path,$controller,$action);

        // d('app\\'.APP_NAME.'\\controller\\'.ucfirst($controller).'Controller');
        $controller = 'app\\'.APP_NAME.'\\controller\\'.ucfirst($controller).'Controller';
        $controller = new $controller($view);
        // dump($controller);
        // 将控制器方法执行结果的响应，返回前端页面展示
        echo call_user_func_array([$controller,$action],$params);
    }

    private static function setConst()
    {
        // 1.框架核心代码库路径
        define('CORE_PATH', __DIR__);

        // 2.项目根目录
        define('ROOT_PATH', dirname(__DIR__));

        // 3.应用路径
        define('ROOT_APP_PATH', ROOT_PATH. DIRECTORY_SEPARATOR . 'app');

        // 4.配置文件路径
        // 配置分二级：全局项目级配置，应用配置
        // 应用配置>全局配置
        // 全局配置
        $defaultConfig =  ROOT_PATH. DIRECTORY_SEPARATOR . 'config.php';
        // 应用配置
        $appConfig =  ROOT_APP_PATH. DIRECTORY_SEPARATOR . 'config.php';
        // 如果存在应用配置优先配置，否则用全局配置
        define('CONFIG', require file_exists($appConfig) ? $appConfig : $defaultConfig);
        
        // 5.调式开关常量
        // ini_set 修改php ini 的配置项（部分）
        ini_set('display_errors', CONFIG['app']['debug'] ? 'Off' : 'On');   
    }

    //自动加载器
    private static function autoLoader($class)
    {
        // 依据类命名空间与路径关系，生成类文件的加载路径
        // core\Db => core/Db.php
        $file = str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php';

        file_exists($file) ? require $file : die($class . '类文件不存在');
    }
}